; B5OV-1.INS - Osborne Vixen insert for BYE5 - 07/17/85
;
;	     8251A with BIOS routines setting baud rate
;
;
; This version is for an 8251A I/O with extended BIOS jump for setting
; baudrate.  Note:  This is an insert, not an overlay.
;
; This version is for the Osborne Vixen which uses an extended BIOS
; function call to set the baudrate.  The normal serial input interrupt
; driver in BIOS is disabled while BYE5 is used.
;
;
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;  06/15/85  Written for use with BYE5		- Roy Robinson
;						  FOG RCPM #4
;						  (415) 591-6259
;=   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;-----------------------------------------------------------------------
; PATCH #1 -------------------------------------------------------------
;-----------------------------------------------------------------------
;
; Listed below is a patch for disabling the serial input interrupt
; driver in the Vixen BIS.  This patch goes AFTER the label
;
;   START1:
;
; and immediately AFTER the line of code, CALL MDCARCK
;
; ---->  beginning of patch:
;
;
;	JNZ	BYPASS
;
;INITMOD:
;	PUSH	PSW
;	MVI	C,7	; Use BDOS to obrain current IOBYTE
;	CALL	BDOS	;
;	STA	OLDIOB	; Save old IOBYTE
;	ANI	3fH	;
;	ORI	80H	; Make CEN: PORT new LST: DEVICE
;	MOV	E,A
;	MVI	C,8
;	CALL	BDOS	; Use BDOS to place new IOBYTE in first page of memory
;
;	DI		;
;	LHLD	INTVEC	; Get serial port interrupt processor address
;	SHLD	OLDVEC	; Save serial port interrupt processor address
;	DCX	H
;	DCX	H
;	DCX	H	; HL has next interrupt processor address
;	SHLD	INTVEC	; This is now first interrupt processor rather
;			;   than second
;
;INITSIO:
;
;	LHLD	BIOS	; Find start ofF BIOS
;	MVI	L,3CH	; Displacement of baudrate byte from start of BIOS
;	MOV	A,M
;	STA	OLDBAUD ; Save original baudrate byte
;
;	MVI	L,3BH	; Displacement of 8251 mode byte from start of BIOS
;	MOV	A,M	; Old mode byte set by ROM is 2SB, NP, 8DB, X16 clock
;	STA	OLDMODE ; Save original 8251 mode byte
;
;	MOV	B,L
;	MVI	A,6EH	; 1 SB, NP, 8 DB, X16 clock modem byte
;	CALL	IORESET ; Use extended BIOS jump to reset 8251
;
;	MVI	A,37H	; 8251 command byte RTS/DTR active, TXD and RXD active
;	OUT	31H	; Send it to 8251 control port
;
;	MVI	A,3	; Select 8155 port C
;	OUT	21h	;
;	IN	28h	; Get miscellaneous byte
;	STA	OLDMSC	; Save misdellaneous info byte
;	ORI	00001111B
;			; Disable ring detect interrupt, RXD interrupt, XMIT
;			;   interrupt, emab;e omterma; clock
;	MOV	E,A
;	MVI	A,3
;	OUT	21h	; Select 8155 port C
;	MOV	A,E
;	OUT	28h	; Send new control byte to 8155 port C
;	EI
;	POP	PSW
;	ORA	A
;
;BYPASS:
;
;--> Original code starts again with the following instruction:
;
;	JNZ	GOODBY
;
;
;=======================================================================
;
;-----------------------------------------------------------------------
; PATCH #2 -------------------------------------------------------------
;-----------------------------------------------------------------------
;
;
; Listed below is a patch for re-enabling the serial input interrupt
; driver in the Vixen.	Place this patch before the instruction line
; "JMP	0000H" in the EXCPM routine.
;
;--> Patch starts here
;
;RSTINT:LDA	OLDIOB	; Get original IOBYTE
;	MVI	C,8
;	MOV	E,A	; Use BDOS to restore original IOBYTE
;	CALL	BDOS
;
;	DI
;	XRA	A
;	OUT	STPORT	; Disable 8251 DTR/RTS lines
;	LHLD	OLDVEC	; Get original interrupt service address
;	SHLD	INTVEC	; Restore original interrupt service address
;	MVI	A,3	; Select 8155 port C
;	OUT	21H
;	IN	28H	; Get misc. info byte for controlling interrupt lines
;	ANI	030H	; Zero the least significant four bits, keep the
;			;   remainining two most significant bits
;	MOV	E,A
;	LDA	OLDMSC	; Get original misc. 8155 control byte
;	ANI	0FH	; Keep least significant four bits
;	ORA	E	; Combine everything
;	MOV	E,A
;	MVI	A,3
;	OUT	21H	; Select 8155 port C
;	MOV	A,E
;	OUT	28H	; Restore original 8155 control byte
;	EI
;
;	MVI	B,3CH
;	LDA	OLDBAUD ; Restore original baudrate byte
;	CALL	IORESET ; Do an 8251 reset
;
;	MVI	B,3BH
;	LDA	OLDMODE ; Restore original mode byte
;	CALL	IORESET ; Do an 8251 reset
;
;--> Original code starts again with the following instruction:
;
;	JMP	0000H
;
;-----------------------------------------------------------------------
;
;
; E Q U A T E S
;
;
INTVEC	EQU	0EFFEH		; Address of interrupt vector to first interrupt
				; Service routine
BDOS	EQU	0005H		; Address of bdos entry point in first page of RAM
BIOS	EQU	0001H		; Address of pointer to CP/M warm boot jump in BIOS
AJUMP	EQU	0C3H		; JUMP instruction opcode
;
;
PORT	EQU	030H
DATPORT	EQU	PORT		; Modem data port
STPORT	EQU	PORT+1		; Modem status port
;
;
;-----------------------------------------------------------------------
;
; Is there a carrier?  If not, return with the zero flag set.
;
MDCARCK:MVI	A,17H		; Reset status
	OUT	STPORT
	IN	STPORT		; Get status
	ANI	80H		; Check for carrier detect
	RET
;.....
;
;
; This routine will turn off the serial card and hang up the phone.
;
MDINIT:	MVI	A,10H		; Clear DTR
	OUT	STPORT		; Causing modem to hangup
	PUSH	B		; Preserve in case we need it
	MVI	B,20		; 2 seconds to drop DTR

OFFTI:	CALL	DELAY		; 0.1 second delay
	DCR	B
	JNZ	OFFTI		; Keep waiting until carrier drops
	POP	B		; Restore BC
	MVI	A,17H		; Raise DTR so that modem can answer the phone
	OUT	STPORT
;
	 IF	IMODEM
	CALL	IMINIT		; Initialize smartmodem
	 ENDIF			; IMODEM
;
	RET
;.......
;
;
; Input a character from the modem.
;
MDINP:	IN	DATPORT		; Get character
	RET
;.....
;
;
; Check the status to see if a character is available.  Return with zero
; flag set, if not.  If yes, use 0FFH to clear the flag.
;
MDINST:	IN	STPORT		; Get status
	ANI	2		; Got a character?
	RZ			; Return if none
	IN	STPORT		; Get status again
	ANI	ERR		; Check for framing and overrun
	JZ	MDINST1		; No errors
	MVI	A,17H		; Reset error flags
	OUT	STPORT
	XRA	A		; Return false
	RET
;.....
;
;
MDINST1:ORI	0FFH		; We have a character
	RET			; And return
;.....
;
;
; Send a character to the modem.
;
MDOUTP:	OUT	DATPORT		; Send it
	RET
;.....
;
;
; See if the output is ready for another character.
;
MDOUTST:IN	STPORT		; Read port
	ANI	4		; Mask crap
	RZ
	ORI	0FFH
	RET
;.....
;
;
; Re-initialize modem and hang up phone by dropping DTR and leaving
; modem inactive
;
MDQUIT:	 IF	IMODEM
	CALL	IMQUIT
	 ENDIF			; IMODEM
;
;
; Called by main BYE program after caller types BYE
;
MDSTOP:	XRA	A		; Turn off rts/dtr, rx/tx
	OUT	STPORT		; Command byte to 8251 control port
	RET
;.....
;
;
; If you do not support a particular baud rate, put it here before
; SETINV:
;
SETINV:	MVI	A,0FFH
	ORI	A		; Make sure the Zero flag is not set
	RET
;.....
;
;
SET300:	MVI	A,06H		; Store baud rate parameter (300 baud)
	MVI	B,3CH
	JMP	SETBAUD
;
SET1200:MVI	A,08H		; Store baud rate parameter (1200 baud)
	MVI	B,3CH
	JMP	SETBAUD
;
SET2400:MVI	A,0BH		; Store baud rate parameter (2400 baud)
	MVI	B,3CH

SETBAUD:CALL	IORESET		; Use extended BIOS function to reset baudrate
	XRA	A		; Say baudrate change was satisfactory
	RET
;.....
;
;
IORESET:
;
; Subroutine which executes a master reset for 8251.  8251 reset is a
; BIOS function in VIXEN extended BIOS
;
;	ENTRY:
;	A	=	byte value to be replaced in BIOS
;			(mode byte or baudrate byte)
;
;	B	=	hex displacement from base of BIOS
;			for mode byte or baudrate byte
;			(mode byte = 3BH)
;			(baudrate byte = 3CH)
;
;	EXIT:
;	NONE
;
	LHLD	BIOS		; Find base of BIOS
	MOV	L,B
	MOV	M,A
	MVI	L,36H		; Displacement in BIOS for 8251 reset function
	SHLD	EXTFUN
	CALL	BIOSFUNC	; Subroutine call of BIOS 8251 reset function
	RET
;.....
;
;
OLDIOB:	DS	1		; Original  IOBYTE
OLDMSC:	DS	1		; Original misc. control byte for 8155 port C
OLDVEC:	DS	2		; Original interrupt service vector
OLDMODE:DB	1		; Original 8251 mode byte from BIOS
OLDBAUD:DB	1		; Original baudrate byte for 8251 from BIOS
BIOSFUNC: DB	AJUMP		; Absolute jump to the	following memory address
EXTFUN:	DS	2		; BIOS extended function address
;.....
;
;			       end
;-----------------------------------------------------------------------
